package cn.ljy.common.utils.table;

import cn.hutool.poi.excel.ExcelWriter;
import cn.hutool.poi.excel.StyleSet;
import org.apache.poi.ss.usermodel.*;
import org.springframework.util.StringUtils;

/**
 * hutool表格操作的一些通用操作函数
 */
public class MyHutoolExcelUtil {
    /**
     * 方法描述: 在原有全局的基础样式上进行设置，修改所有样式
     * 特别说明：执行该方法后会自动修改表格的标题样式（也就是说函数用void修饰也可以）
     *
     * 默认 全局水平居中+垂直居中
     * 默认 自动换行
     * 默认单元格边框颜色为黑色，细线条
     * 默认背景颜色为白色
     *
     * @param writer writer
     * @param font   字体样式
     * @return cn.hutool.poi.excel.StyleSet
     * @author wqf
     * @date 2021/5/28 10:43
     */
    public static StyleSet setBaseGlobalStyle(ExcelWriter writer, Font font) {
        //全局样式设置
        StyleSet styleSet = writer.getStyleSet();
        //设置全局文本居中
        styleSet.setAlign(HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
        //设置全局字体样式
        styleSet.setFont(font, true);
        //设置背景颜色 第二个参数表示是否将样式应用到头部
        styleSet.setBackgroundColor(IndexedColors.WHITE, true);
        //设置自动换行 当文本长于单元格宽度是否换行
        //styleSet.setWrapText();
        // 设置全局边框样式
        styleSet.setBorder(BorderStyle.THIN, IndexedColors.BLACK);
        return styleSet;
    }

    /**
     * 方法描述: 设置标题的基础样式。
     * 特别说明：执行该方法后会自动修改表格的标题样式（也就是说函数用void修饰也可以）
     * @param writer
     * @param font                字体样式
     * @param horizontalAlignment 水平排列方式
     * @param verticalAlignment   垂直排列方式
     * @return org.apache.poi.ss.usermodel.CellStyle
     * @author wqf
     * @date 2021/5/28 10:16
     */
    public static CellStyle createHeadCellStyle(ExcelWriter writer, Font font,
                                                HorizontalAlignment horizontalAlignment,
                                                VerticalAlignment verticalAlignment) {
        CellStyle headCellStyle = writer.getHeadCellStyle();
        headCellStyle.setAlignment(horizontalAlignment);
        headCellStyle.setVerticalAlignment(verticalAlignment);
        headCellStyle.setFont(font);
        return headCellStyle;
    }

    /**
     * 方法描述: 设置基础字体样式字体 这里保留最基础的样式使用
     *
     * @param bold     是否粗体
     * @param fontName 字体名称
     * @param fontSize 字体大小,0表示默认
     * @param fontColor 字体颜色，用Font.XX来调用。0表示不设置样式
     * @return org.apache.poi.ss.usermodel.Font
     * @author wqf
     * @date 2021/5/19 15:58
     */
    public static Font createFont(ExcelWriter writer, boolean bold, boolean italic, String fontName, short fontSize,short fontColor) {
        Font font = writer.getWorkbook().createFont();
        //设置是否加粗
        font.setBold(bold);
        //设置是否斜体
        font.setItalic(italic);
        //设置字体名称 宋体 / 微软雅黑 /等
        if(StringUtils.hasLength(fontName)){
            font.setFontName(fontName);
        }
        if(fontSize!=0){
            //设置字体大小 以磅为单位
            font.setFontHeightInPoints(fontSize);
        }
        // 设置字体颜色
        font.setColor(fontColor);

        return font;
    }

    /**
     * 方法描述: 设置行或单元格基本样式
     *
     * @param writer              writer
     * @param font                字体样式
     * @param wrapText 自动换行
     * @param verticalAlignment   垂直居中
     * @param horizontalAlignment 水平居中
     * @return CellStyle
     * @author wqf
     * @date 2021/5/28 10:28
     */
    public static CellStyle createCellStyle(ExcelWriter writer, Font font, boolean wrapText,
                                            VerticalAlignment verticalAlignment,
                                            HorizontalAlignment horizontalAlignment) {
        //CellStyle cellStyle = writer.getWorkbook().createCellStyle();
        //CellStyle cellStyle = writer.getStyleSet().getCellStyle();
        CellStyle cellStyle = writer.createCellStyle();//创建新的样式，不会影响原来的样式
        cellStyle.setVerticalAlignment(verticalAlignment);
        cellStyle.setAlignment(horizontalAlignment);
        cellStyle.setWrapText(wrapText);//设置自动换行
        cellStyle.setFont(font);
        return cellStyle;
    }

}
